package com.Logs.test_1_27_springbootlogs;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Test127SpringBootLogsApplication {

    public static void main(String[] args) {
        SpringApplication.run(Test127SpringBootLogsApplication.class, args);

        // **** SpringBoot 日志 ****
        // 日志的作用: 1.定位和发现问题
        //           2.监控作用
        //           3.数据采集(比如在淘宝上想买一个东西的时候, 我们还没有在淘宝上找,只是在网搜了一下,
        //                    这时候再进去淘宝的时候, 淘宝直接推荐了我们想要搜的内容).

        // 1. 系统监控
        //监控现在⼏乎是⼀个成熟系统的标配, 我们可以通过⽇志记录这个系统的运⾏状态, 每⼀个⽅法的响应
        //时间, 响应状态等, 对数据进⾏分析, 设置不同的规则, 超过阈值时进⾏报警. ⽐如统计⽇志中关键字的数
        //量，并在关键字数量达到⼀定条件时报警，这也是⽇志的常⻅需求之⼀

        // 2. 数据采集
        //数据采集是⼀个⽐较⼤的范围, 采集的数据可以作⽤在很多⽅⾯, ⽐如数据统计, 推荐排序等.
        //• 数据统计: 统计⻚⾯的浏览量(PV), 访客量(UV), 点击量等, 根据这些数据进⾏数据分析, 优化公司运营
        //策略
        //• 推荐排序: ⽬前推荐排序应⽤在各个领域, 我们经常接触的各⾏各业很多也都涉及推荐排序, ⽐如购
        //物, ⼴告, 新闻等领域. 数据采集是推荐排序⼯作中必须做的⼀环, 系统通过⽇志记录⽤⼾的浏览历
        //史, 停留时⻓等, 算法⼈员通过分析这些数据, 训练模型, 给⽤⼾做推荐.

        // 3. ⽇志审计
        //随着互联⽹的发展，众多企业的关键业务越来越多的运⾏于⽹络之上. ⽹络安全越来越受到⼤家的关
        //注, 系统安全也成为了项⽬中的⼀个重要环节, 安全审计也是系统中⾮常重要的部分. 国家的政策法规、
        //⾏业标准等都明确对⽇志审计提出了要求. 通过系统⽇志分析，可以判断⼀些⾮法攻击, ⾮法调⽤，以
        //及系统处理过程中的安全隐患.

        // **** 日志的使用 ****
        // 如何打印日志?
        // SpringBoot 本身帮我们集成了日志框架, 我们直接使用即可以了
        // 第一步: 定义日志对象
        // 第二步: 打印日志
        // 在 LoggerController 中演示

        // 这样做可以让我们在日志中找到这个代码来自与哪里

        // 门面模式的实现
        // facade 包中展示

        //⻔⾯模式的优点
        //• 减少了系统的相互依赖. 实现了客⼾端与⼦系统的耦合关系, 这使得⼦系统的变化不会影响到调⽤它
        //的客⼾端；
        //• 提⾼了灵活性, 简化了客⼾端对⼦系统的使⽤难度, 客⼾端⽆需关⼼⼦系统的具体实现⽅式, ⽽只需
        //要和⻔⾯对象交互即可.
        //• 提⾼了安全性. 可以灵活设定访问权限, 不在⻔⾯对象中开通⽅法, 就⽆法访问

        // SLF4J 框架的介绍
        // SLF4J 就是其他⽇志框架的⻔⾯. SLF4J 可以理解为是提供⽇志服务的统⼀API接⼝, 并不涉及到具体的
        //⽇志逻辑实现

        // 不引⼊⽇志⻔⾯
        //常⻅的⽇志框架有log4J, logback等. 如果⼀个项⽬已经使⽤了log4j，⽽你依赖的另⼀个类库，假如是
        //Apache Active MQ, 它依赖于另外⼀个⽇志框架logback, 那么你就需要把logback也加载进去

        // 存在问题:
        //1. 不同⽇志框架的API接⼝和配置⽂件不同, 如果多个⽇志框架共存, 那么不得不维护多套配置⽂件(这
        //个配置⽂件是指⽤⼾⾃定义的配置⽂件).
        //2. 如果要更换⽇志框架, 应⽤程序将不得不修改代码, 并且修改过程中可能会存在⼀些代码冲突.
        //3. 如果引⼊的第三⽅框架, 使⽤了多套, 那就不得不维护多套配置

        //引⼊⽇志⻔⾯
        //引⼊⻔⾯⽇志框架之后, 应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架
        //实现), 此时应⽤程序只需要维护⼀套⽇志⽂件配置, 且当底层实现框架改变时, 也不需要更改应⽤程序代
        //码.

        // SLF4J 就是这个⽇志⻔⾯.
        //总的来说，SLF4J使你的代码独⽴于任意⼀个特定的⽇志API，这是⼀个对于开发API的开发者很好的思
        //想.

        // **** 日志的级别 ****

        // 打印日志的类?
        // 在Controller 中展示,
        // 还是定义日志对象的呢个

        // 那么日志的级别是什么?
        // ⽇志级别代表着⽇志信息对应问题的严重性, 为了更快的筛选符合⽬标的⽇志信息


        // **** ⽇志级别的分类 ****
        //⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE

        //• FATAL: 致命信息，表⽰需要⽴即被处理的系统级错误.
        //• ERROR: 错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏.
        //• WARN: 警告信息, 不影响使⽤, 但需要注意的问题
        //• INFO: 普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息, 例如系统启动完成、请求处理完成等.
        //• DEBUG: 调试信息, 需要调试时候的关键信息打印.
        //• TRACE: 追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意，否则请使⽤DEBUG级别替代)

        // 日志的使用, 还是 在 Controller 包里面

        // **** 日志持久化 ****

        // 数据保存在数据库中,是一种持久化的方式
        // 日志保存在文件中,也是一种持久化的方式
        // 把日志保存在文件中来完成持久化
        // 需要加一些配置
        // logging:
        //  file:
        //   name: aaa.log
        // 如果没有加路径, 默认是放在当前项目下


        // 日志的分割
        // logging:
        //    logback:
        //      rollingpolicy:
        //      max-file-size: 1KB
        // 不是达到1KB就立刻分割

        // 配置日志的格式
        // 如关闭启动时间
        // logging:
        //    pattern:
        //      console:


        // 打印日志的更好的方法
        // 使用一个注解 @Slf4j
        // 这时候就会自动帮我们生成一个日志对象log,我们直接用就可以了, 就不需要自己定义了
        // 可以加载接口上, 也可以加载类上

    }

}
